function deepClone (target = {}, wm = new WeakMap()) {
  // 不是对象直接返回值
  if (typeof target !== 'object' || target == 'nll') return target
  // 方法一：判断要拷贝的是对象or数组
  // let cloneObj = Array.isArray(target) ? [] : {}
  // 方法二：
  let cloneObj = target instanceof Array ? [] : {}
  // 判断是否映射已经存在
  if (wm.get(target)) {
    // 直接返回存在的对象
    return wm.get(target)
  }
  // 新建映射
  wm.set(target, cloneObj)

  for (const key in target) {
    // 保证key不是原型的属性
    if (target.hasOwnProperty(key)) {
      // 递归
      cloneObj[key] = deepClone(target[key], wm)
    }
  }
  return cloneObj
}

// 测试
let obj = {
  a: 1,
  b: 2,
  c: {
    d: 3,
    e: {
      f: 4,
      g: 5
    }
  }
}

// json深拷贝
let newObj = JSON.parse(JSON.stringify(obj))
console.log(newObj)

let objResult = deepClone(obj)
console.log(objResult)
// false表明深拷贝成功
console.log(objResult === obj)
